#include <iostream>
#include <termios.h>
#include <unordered_set>
#include <chrono>
#include <fcntl.h>
#include <iomanip>
#include <linux/fb.h>
#include <opencv2/opencv.hpp>
#include <sstream>
#include <sys/ioctl.h>
#include <sys/mman.h>
#include <unistd.h>

using namespace cv;
using namespace std;
using namespace std::chrono;

// 帧处理参数
const int targetWidth = 640;   // 输入图像宽度
const int targetHeight = 480;  // 输入图像高度
const int morphIterations = 2; // 形态学操作迭代次数

// 将 RGB888 转换为 RGB565（未修改）
ushort rgb888_to_rgb565(const Vec3b& color) {
    return ((color[2] >> 3) << 11) | ((color[1] >> 2) << 5) | (color[0] >> 3);
}

// 获取当前时间字符串（未修改）
string getCurrentTime() {
    auto now = system_clock::now();
    auto now_time_t = system_clock::to_time_t(now);
    auto now_tm = *localtime(&now_time_t);

    stringstream ss;
    ss << put_time(&now_tm, "%Y-%m-%d %H:%M:%S");
    return ss.str();
}

// 斑马线检测核心函数（完整修改版）
void detectZebraCrossing(Mat& frame) {
    Mat hsv, blue_mask, non_blue_mask, binary, blurred, closed;

    // 改动1：颜色空间转换 + 二值化处理
    // 目标：将蓝色道路转为白色(255)，黄色/白色边线转为黑色(0)
    cvtColor(frame, hsv, COLOR_BGR2HSV); // 转为HSV空间更易颜色分割

    // HSV颜色阈值定义
    Scalar lower_blue(90, 50, 50), upper_blue(130, 255, 255);    // 蓝色范围（道路）
    Scalar lower_yellow(20, 100, 100), upper_yellow(30, 255, 255); // 黄色边线
    Scalar lower_white(0, 0, 200), upper_white(180, 30, 255);     // 白色斑马线

    // 生成颜色掩码
    inRange(hsv, lower_blue, upper_blue, blue_mask); // 蓝色道路区域
    Mat yellow_mask, white_mask;
    inRange(hsv, lower_yellow, upper_yellow, yellow_mask); // 黄色边线
    inRange(hsv, lower_white, upper_white, white_mask);    // 白色斑马线
    bitwise_or(yellow_mask, white_mask, non_blue_mask);    // 合并非蓝色区域

    // 生成二值图像（核心逻辑）
    binary = Mat::zeros(frame.size(), CV_8UC1); // 初始化为全黑
    binary.setTo(255, blue_mask);    // 蓝色道路设为白色
    binary.setTo(0, non_blue_mask);  // 黄/白区域设为黑色

    // 改动2：使用中值滤波（抑制噪声）
    medianBlur(binary, blurred, 5);  // 5x5核，去除细小噪点

    // 改动3：闭运算（连接相邻斑马线区域）
    Mat kernel = getStructuringElement(MORPH_RECT, Size(3, 1)); // 水平方向核
    morphologyEx(blurred, closed, MORPH_CLOSE, kernel, Point(-1, -1), morphIterations);

    // 轮廓检测与过滤
    vector<vector<Point>> contours;
    findContours(closed, contours, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE);

    for (const auto& cnt : contours) {
        Rect rect = boundingRect(cnt);
        float aspectRatio = (float)rect.width / rect.height;

        // 改动4：增加过滤条件排除减速带
        bool isZebra = rect.height > 20 && aspectRatio > 5 && 
                      rect.width > 30 && rect.width < 150 &&
                      aspectRatio < 20; // 限制宽高比排除细长干扰

        if (isZebra) {
            rectangle(frame, rect, Scalar(0, 255, 0), 2);
            putText(frame, "Zebra", Point(rect.x, rect.y-5),
                    FONT_HERSHEY_SIMPLEX, 0.5, Scalar(0, 255, 0), 1);
        }
    }
}

// 主函数（示例用法）
int main() {
    VideoCapture cap(0); // 打开摄像头
    if (!cap.isOpened()) {
        cerr << "Error opening camera!" << endl;
        return -1;
    }

    // 设置摄像头分辨率
    cap.set(CAP_PROP_FRAME_WIDTH, targetWidth);
    cap.set(CAP_PROP_FRAME_HEIGHT, targetHeight);

    Mat frame;
    while (true) {
        cap >> frame;
        if (frame.empty()) break;

        detectZebraCrossing(frame); // 执行检测

        imshow("Zebra Crossing Detection", frame);
        if (waitKey(1) == 27) break; // ESC退出
    }

    cap.release();
    destroyAllWindows();
    return 0;
}